﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Roton.ZZT
{
    /// <summary>
    /// Interface used to interact with element properties.
    /// </summary>
    interface IElement
    {
        /// <summary>
        /// If true, this tile will be shown even when the board is dark. Only used in ZZT.
        /// </summary>
        bool AlwaysShown { get; set; }

        /// <summary>
        /// Character value for this element.
        /// </summary>
        int Char { get; set; }

        /// <summary>
        /// Color value for this element. 00-EF = fixed, F0-FE = editor-fixed, FF = not specified.
        /// </summary>
        int Color { get; set; }

        /// <summary>
        /// Default cycle for this element. -1 = this element is not created with a Thing by default.
        /// </summary>
        int Cycle { get; set; }

        /// <summary>
        /// If true, this element can be destroyed by projectiles.
        /// </summary>
        bool Destructible { get; set; }

        /// <summary>
        /// If true, enables a subroutine to be called to determine the ANSI character to draw instead of using the default.
        /// </summary>
        bool DrawCodeEnable { get; set; }

        /// <summary>
        /// Text to show in the editor when selecting destination board.
        /// </summary>
        IString EditorBoard { get; }

        /// <summary>
        /// Text to show in the element list to separate categories.
        /// </summary>
        IString EditorCategory { get; }

        /// <summary>
        /// Text to show when editing code for this element.
        /// </summary>
        IString EditorCode { get; }

        /// <summary>
        /// If true, this element acts like a floor in the editor; enemies can be placed on top.
        /// </summary>
        bool EditorFloor { get; set; }

        /// <summary>
        /// Text to show in the editor when editing parameter 1.
        /// </summary>
        IString EditorP1 { get; }

        /// <summary>
        /// Text to show in the editor when editing parameter 2.
        /// </summary>
        IString EditorP2 { get; }

        /// <summary>
        /// Text to show in the editor when editing parameter 3.
        /// </summary>
        IString EditorP3 { get; }

        /// <summary>
        /// Text to show in the editor when editing the step vector.
        /// </summary>
        IString EditorStep { get; }

        /// <summary>
        /// If true, this element acts like a floor during gameplay; enemies and projectiles can move over it freely.
        /// </summary>
        bool Floor { get; set; }

        /// <summary>
        /// Key to show in the editor menu for this element.
        /// </summary>
        int Key { get; set; }

        /// <summary>
        /// Editor menu in which to show this element.
        /// </summary>
        int Menu { get; set; }

        /// <summary>
        /// The name of this element.
        /// </summary>
        IString Name { get; }

        /// <summary>
        /// Number of points that will be added to the player's score when killed.
        /// </summary>
        int Points { get; set; }

        /// <summary>
        /// If true, this element can be pushed.
        /// </summary>
        bool Pushable { get; set; }
    }
}
